﻿using System;
using System.Collections.Generic;
using GSQ.BusinessEntities;
using GSQ.DataAccess;

namespace GSQ.BusinessLogic
{
    public class ComprasBL
    {
        public decimal Insert(COMPRAS value)
        {
            if (value.IsValid())
            {
                if (value.COMPRAS_DETALLES.Count == 0)
                { throw new ArgumentException("No puede crear COMPRAS sin agregar detalle"); }
                ComprasDA comprasDA = new ComprasDA();

                #region Validad envio NCF
                if (value.NCF != null && value.NCF.Length == 19)
                    if (comprasDA.ValidarEnvioNcf(value.ID_SUPLIDOR, value.NCF))
                    {
                        throw new ArgumentException("Ncf ya registrado para este suplidor.");
                    }
                #endregion

                #region Validad envio Nro factura
                if (value.NRO_FACTURA != string.Empty)
                    if (comprasDA.ValidarEnvioNroFactura(value.ID_SUPLIDOR, value.NRO_FACTURA))
                    {
                        throw new ArgumentException("Nro. Documento ya registrado para este suplidor.");
                    }
                #endregion

                #region Validar
                if (value.SUPLIDORES.RNC != "0" && value.NCF != string.Empty)
                    value.TIPO = true;
                else
                    value.TIPO = false;

                if (value.ID_CONDICION == 1)
                {
                    value.F_VENCIMIENTO = value.FECHA.AddDays(Convert.ToDouble(value.SUPLIDORES.PLAZO_PAGO));
                }
                #endregion

                return comprasDA.Insert(value);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public decimal Update(COMPRAS newValue, COMPRAS oldValue)
        {
            if (newValue.IsValid())
            {
                if (newValue.COMPRAS_DETALLES.Count == 0)
                { throw new ArgumentException("No puede crear COMPRAS sin agregar detalle"); }

                ComprasDA comprasDA = new ComprasDA();

                #region Validad envio NCF
                if (oldValue.NCF != null)
                    if (newValue.NCF.Length == 19 && newValue.NCF != oldValue.NCF)
                        if (comprasDA.ValidarEnvioNcf(newValue.ID_SUPLIDOR, newValue.NCF))
                        {
                            throw new ArgumentException("Ncf ya registrado para este suplidor.");
                        }
                #endregion

                #region Validad envio Nro factura
                if (newValue.NRO_FACTURA != string.Empty && newValue.NRO_FACTURA != oldValue.NRO_FACTURA)
                    if (comprasDA.ValidarEnvioNroFactura(newValue.ID_SUPLIDOR, newValue.NRO_FACTURA))
                    {
                        throw new ArgumentException("Nro. Documento ya registrado para este suplidor.");
                    }
                #endregion

                #region Validar
                if (newValue.SUPLIDORES.RNC != "0" && newValue.NCF != string.Empty)
                    newValue.TIPO = true;
                else
                    newValue.TIPO = false;

                if (newValue.ID_CONDICION == 1)
                {
                    newValue.F_VENCIMIENTO = newValue.FECHA.AddDays(Convert.ToDouble(newValue.SUPLIDORES.PLAZO_PAGO));
                }
                #endregion

                return comprasDA.Update(newValue, oldValue);
            }
            else
                throw new ArgumentException("La entidad no esta valida");

        }

        public COMPRAS GetById(decimal id)
        {
            return new ComprasDA().GetById(id);
        }

        public List<COMPRAS> GetAll()
        {
            return new ComprasDA().GetAll();
        }

        public List<COMPRAS> GetByFechas(DateTime value1, DateTime value2)
        {
            return new ComprasDA().GetByFechas(value1, value2);
        }

        public List<COMPRAS> GetByIdSuplidor(decimal id)
        {
            return new ComprasDA().GetBySuplidor(id);
        }

        public List<COMPRAS> GetBySuplidor(string value)
        {
            return new ComprasDA().GetBySuplidor(value);
        }

        public List<COMPRAS> GetByNroFactura(string nroFactura)
        {
            return new ComprasDA().GetByNroFactura(nroFactura.Trim());
        }

        public void ActivarDesactivar(decimal id)
        {
            if (this.GetById(id).ACTIVO)
                new ComprasDA().DesaplicarCompra(id);
            else
                new ComprasDA().AplicarCompra(id);
        }
    }
}
